// 浅拷贝测试
// 1 Object.assign

// const original = { a: 1, b: { c: 2 } };  
// const shallowCopy = Object.assign({}, original); //接受两个参数，第一个是返回的新对象 第二个是目标对象 
// console.log(shallowCopy); // { a: 1, b: { c: 2 } }  
// shallowCopy.b.c = 3;  
// console.log(original); // (因为对象是引用类型，所以修改了副本中的对象也影响了原对象)

// const array1=[1,2,3,4,5,{a:6}];
// const array2=Object.assign([],array1)
// console.log(array2);
// console.log(array1[5]===array2[5]);



// 2展开运算符
// const arr1=[1,2,3,4,{c:5}]
// const arr2=[...arr1]
// console.log(arr2);
// console.log(arr1[4]===arr2[4]);

// 3 array.slice() 不带参数,会返回原数组的一个完整浅拷贝。
const originalArray = [1, 2, { a: 3 }];  
const shallowCopyArray = originalArray.slice();  // start end
console.log(shallowCopyArray); // [1, 2, { a: 3 }]  
shallowCopyArray[2].a = 4;  
console.log(originalArray[2].a); // 4 (数组中的对象也是引用类型)


// array.concat()  当concat()方法不带参数时，它默认返回一个与原数组完全相同的新数组。
const originalArray1 = [1, 2, { a: 3 }];  
const shallowCopyArray1 = originalArray1.concat();  
console.log(shallowCopyArray); // [1, 2, { a: 3 }]  
shallowCopyArray1[2].a = 4;  
console.log(originalArray1[2].a); // 4 (同样，修改了副本中的数组对象属性也影响了原数组)


// 深拷贝
// 1、JSON转换法
// 解释：JSON转换法利用JSON.stringify()将对象转换为JSON字符串，
// 然后再使用JSON.parse()将字符串解析为对象。
// 由于JSON转换过程中会重建对象，因此可以实现深拷贝
function deepCopyJSON(obj) {  
    try {  
        return JSON.parse(JSON.stringify(obj));  
    } catch (error) {  
        console.error('JSON转换法深拷贝失败:', error);  
        return null; // 或者抛出错误，根据需求处理  
    }  
}  
  
// 示例（注意：这个示例不包含不能由JSON处理的数据类型）  
const original = { a: 1, b: { c: 2, d: [3, 4] } };  
const deepCopy = deepCopyJSON(original);  
deepCopy.b.d[0] = 99;  
console.log(original.b.d[0]); // 输出: 3 (原对象未受影响)

// 2、递归法
// 思路
// 1 判断函数的边界条件 undefined  null
// 2 非引用类型 正常打印
// 3 引用类型 进行递归
const arr3=[1,2,3,{a:11,b:22}]

function deep(arr){
    if(arr==null || typeof arr !=="object"){
        return arr;
    }
    // 处理数组
    if(Array.isArray(arr)){
        const result=[]
        for(let i=0;i<arr.length;i++){
            result[i]=deep(arr[i])
        }
        return result;
    }

    // 处理对象
        // 处理对象  
        const result = {};  
        for (const key in arr) {  
            if (arr.hasOwnProperty(key)) {  
                result[key] = deep(arr[key]);  
            }  
        }  
        return result;  
}
const arr4=deep(arr3);
console.log("经过深拷贝的",arr4);
console.log(arr3[3]===arr4[3]);


